iT邦幫忙

2025 iThome 鐵人賽

DAY 7
1
Software Development

ClickHouse 系列:從資料庫底層架構到軟體應用實踐系列 第 7

Day 7|ClickHouse 系列:Materialized Views 即時聚合查詢

  • 分享至 

  • xImage
  •  

在 OLAP 系統中,「即時聚合」與「預先計算」是加速查詢、降低資源消耗的核心策略。ClickHouse 提供了強大的 Materialized Views,能將複雜查詢結果實時寫入表中,並大幅減輕查詢時的運算壓力。

什麼是 Materialized View?

Materialized View 是一種 帶有持久化儲存結果的查詢視圖,當有資料寫入源表 (source table) 時,ClickHouse 會自動根據定義的 SELECT 查詢語句計算並將結果寫入目標表 (target table)。

簡單來說,它就是一種「自動觸發的 Insert + 聚合查詢 + 寫入彙總表」的機制。

特點:

  • INSERT 寫入源表時,自動將計算結果寫入目標表。
  • 目標表通常是 SummingMergeTree / AggregatingMergeTree 等。
  • 只會計算「新寫入資料」的查詢結果,不會對舊資料重新掃描。

基本語法與範例

1. 建立 Source Table (Raw Data Table)

CREATE TABLE events
(
    event_time DateTime,
    page String,
    user_id UInt64,
    views UInt32
) ENGINE = MergeTree
ORDER BY (event_time, page);

2. 建立 Target Table (Aggregate Table)

CREATE TABLE daily_page_views
(
    date Date,
    page String,
    total_views UInt32
) ENGINE = SummingMergeTree
PARTITION BY toYYYYMM(date)
ORDER BY (date, page);

3. 建立 Materialized View

CREATE MATERIALIZED VIEW mv_daily_page_views
TO daily_page_views
AS SELECT
    toDate(event_time) AS date,
    page,
    sum(views) AS total_views
FROM events
GROUP BY date, page;

每當資料寫入 events 表時,ClickHouse 會自動計算每天每頁面的瀏覽量,並寫入 daily_page_views 表中。

運作流程

  1. INSERT → events
  2. Materialized View 觸發 SELECT + 聚合運算
  3. 將結果 INSERT 進 daily_page_views
  4. 查詢 daily_page_views 時直接取用彙總結果

應用場景

應用場景 說明
高頻查詢彙總結果表 (Dashboard/BI 報表) 先將重計算的聚合結果寫入目標表,查詢時僅需掃小型表格
即時Event Streaming彙總 (如 PV/UV 統計) 結合 Kafka + MV,即時統計點擊數、瀏覽量等
指標統計與彙總 (Metrics Storage) 以 Materialized View 實時計算指標數據,適合 IoT、監控平台
ReplacingMergeTree 或 SummingMergeTree 結合 目標表可以使用去重、聚合引擎進一步優化結果儲存

Materialized View 設計重點與限制

1. 目標表 (TO Table) 必須先存在

Materialized View 是寫入目標表的「Trigger」,Target Table 必須先建立好。

2. 只計算新增資料

MV 只會針對「新寫入」的資料進行聚合,不會針對舊資料補算,若源表有歷史資料變動需手動重算。

3. INSERT 觸發查詢,查詢性能依賴目標表設計

目標表應搭配適當的 MergeTree 引擎(Summing, Aggregating, Replacing)來對應資料處理需求。

4. 無法直接支援 UPDATE/DELETE

MV 只會針對 INSERT 事件觸發,若需進行補資料、資料刪除,需配合 ReplacingMergeTree 或 Mutation 處理。

進階:POPULATE 一次性計算歷史資料

若 Materialized View 建立時希望自動將 Source Table 的歷史資料也計算入目標表,可以使用 POPULATE 關鍵字。

CREATE MATERIALIZED VIEW mv_daily_page_views POPULATE
TO daily_page_views
AS SELECT
    toDate(event_time) AS date,
    page,
    sum(views) AS total_views
FROM events
GROUP BY date, page;

注意:

  • POPULATE 只在建立時執行一次,之後不再作用。
  • 若源表有新歷史資料寫入,需要自行做補資料操作。

Materialized View vs View vs LIVE View 差異

類型 說明 主要用途
Materialized View INSERT 時將查詢結果實體化寫入表 即時聚合、資料彙總
View (普通 View) 查詢時執行 SELECT,無資料儲存 簡化複雜查詢語法
LIVE View 基於資料更新自動推送查詢結果 (類似 Streaming Query) 即時查詢動態(但性能較重,不建議大數據場景使用)

最佳實踐與效能建議

實踐策略 說明
搭配 SummingMergeTree 做高效加總表 透過 MV 將大量原始數據彙總到小表,提高查詢性能
Materialized View 支援多層級彙總 可以鏈接多個 MV 形成逐層聚合 (日 → 週 → 月),減少查詢即時計算量
針對大表建 MV 時善用 Partition Key 讓彙總結果根據日期或業務維度分區,減少寫入與查詢時的 I/O 開銷
小心 Insert 負擔 每次寫入都會觸發一次子查詢,若 MV 設計過於複雜會影響寫入效能
與 Kafka Engine 整合,實現流式彙總 MV 可直接從 Kafka Source 自動消費並寫入聚合結果表

結語

Materialized View 提供了一種「自動計算、實時寫入」的聚合機制,讓 ClickHouse 能在高寫入吞吐量下依然保持查詢效能。透過合理設計源表、目標表、聚合邏輯與表引擎選擇,Materialized View 可成為數據分析場景中的效能加速器。


上一篇
Day 6|ClickHouse 系列:SummingMergeTree 進行資料彙總的應用場景
下一篇
Day 8|ClickHouse 系列:分區策略與 Partition Pruning 技術,如何加速大數據查詢
系列文
ClickHouse 系列:從資料庫底層架構到軟體應用實踐30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言